<?php

class Encabezado
{
    /**
     * Número de Emisor que le asignó Banorte
     * @var integer
     */
    private $emisor;

    /**
     * Fecha en la que se transmite el archivo.
     * 8 caracteres de longitud en formato YYYYmmdd
     * @var string 
     */
    private $fecha;
    
    /**
     * Consecutivo de archivos generados en el dia
     * @var integer 
     */
    private $consecutivo;

    /**
     * Número de Afiliaciones Enviadas
     * @var integer 
     */
    private $totalAfiliaciones;
    
    /**
     * Importe total de registros enviados
     * @var float
     */
    private $importeTotal;
    
    /**
     * Número de altas enviadas
     * @var integer 
     */
    private $numTotalAltas;
    
    /**
     * Importe total de las altas
     * @var float
     */
    private $importeTotalAltas;
    
    /**
     * Número de altas enviadas
     * @var integer 
     */
    private $numTotalBajas;
    
    /**
     * Importe total de las altas
     * @var float
     */
    private $importeTotalBajas;
    
    /**
     * Importe total a verificar
     * @var integer
     */
    private $numTotalVerificar;

    private $header;

    public function __construct($emisor, $fecha, $consecutivo, $totalAfiliaciones, $importeTotal, $numAltas, $impTotalAltas, $numBajas, $impTotalBajas, $numVerificar) {
        $this->emisor = $emisor;
        $this->fecha = $fecha;
        $this->consecutivo = $consecutivo;
        $this->totalAfiliaciones = $totalAfiliaciones;
        $this->importeTotal = $importeTotal;
        $this->numTotalAltas = $numAltas;
        $this->importeTotalAltas = $impTotalAltas;
        $this->numTotalBajas = $numBajas;
        $this->importeTotalBajas = $impTotalBajas;
        $this->numTotalVerificar = $numVerificar;
        $this->header = null;
    }

    public function getString() {
        if ($this->header === null) {
            $parts = array();
            $parts[] = 'H'; // Tipo de registro
            $parts[] = 'CP'; // Clave de registro
            $parts[] = $this->getEmisor(); // Emisora
            $parts[] = $this->getFecha();
            $parts[] = $this->getConsecutivo();
            $parts[] = $this->getTotalAfiliaciones();
            $parts[] = $this->getImporteTotal();
            $parts[] = $this->getNumTotalAltas();
            $parts[] = $this->getImporteTotalAltas();
            $parts[] = $this->getNumTotalBajas();
            $parts[] = $this->getImporteTotalBajas();
            $parts[] = $this->getNumTotalVerificar();
            $parts[] = '0'; // Inclusivo
            $parts[] = $this->getFiller();
            $this->header = implode('', $parts);
        }
        return $this->header;
    }
    
    private function getConsecutivo(){
        return str_pad($this->consecutivo, 2, '0', STR_PAD_LEFT);
    }

    private function getEmisor() {
        if ($this->emisor > 99999 || $this->emisor <= 0) {
            throw new Exception('Número de emisor incorrecto. Debe ser númerico de 5'
            . 'caracteres.');
        }
        return str_pad($this->emisor, 5, '0', STR_PAD_LEFT);
    }

    private function getFecha() {
        return $this->fecha;
    }

    private function getTotalAfiliaciones() {
        if ($this->totalAfiliaciones > 999999 || $this->totalAfiliaciones < 0) {
            throw new Exception('Número de total de afiliaciones es incorrecto. Debe ser númerico menor o igual a 999999');
        }
        return str_pad($this->totalAfiliaciones, 6, '0', STR_PAD_LEFT);
    }
    
    private function getImporteTotal() {
        if ($this->importeTotal < 0) {
            throw new Exception('IMPORTE TOTAL MAYOR A CERO');
        }
        $importeTotal = number_format($this->importeTotal, 2, '', '');
        return str_pad($importeTotal, 15, '0', STR_PAD_LEFT);
    }
    
    private function getNumTotalAltas() {
        if ($this->numTotalAltas > 999999 || $this->numTotalAltas < 0) {
            throw new Exception('Número de total de altas es incorrecto. Debe ser númerico menor o igual a 999999');
        }
        return str_pad($this->numTotalAltas, 6, '0', STR_PAD_LEFT);
    }
    
    private function getImporteTotalAltas() {
        if ($this->importeTotalAltas < 0) {
            throw new Exception('IMPORTE TOTAL ALTAS MAYOR A CERO');
        }
        $importeTotalAltas = number_format($this->importeTotalAltas, 2, '', '');
        return str_pad($importeTotalAltas, 15, '0', STR_PAD_LEFT);
    }
    
    private function getNumTotalBajas() {
        if ($this->numTotalBajas > 999999 || $this->numTotalBajas < 0) {
            throw new Exception('Número de total de bajas es incorrecto. Debe ser númerico menor o igual a 999999');
        }
        return str_pad($this->numTotalBajas, 6, '0', STR_PAD_LEFT);
    }
    
    private function getImporteTotalBajas() {
        if ($this->importeTotalBajas < 0) {
            throw new Exception('IMPORTE TOTAL BAJAS MAYOR A CERO');
        }
        $importeTotalBajas = number_format($this->importeTotalBajas, 2, '', '');
        return str_pad($importeTotalBajas, 15, '0', STR_PAD_LEFT);
    }
    
    private function getNumTotalVerificar() {
        if ($this->numTotalVerificar > 999999 || $this->numTotalVerificar < 0) {
            throw new Exception('Número de total de verificar es incorrecto. Debe ser númerico menor o igual a 999999');
        }
        return str_pad($this->numTotalVerificar, 6, '0', STR_PAD_LEFT);
    }

    private function getFiller() {
        return str_pad(' ', 77);
    }

}
